package com.artisan.springuitls.demos;

import org.springframework.stereotype.Component;
import org.springframework.util.SystemPropertyUtils;

/**
 * SystemPropertyUtils 工具类演示
 * 功能：系统属性占位符解析器
 * 优势：解析 ${user.home} 等占位符，比 System.getenv() 更灵活
 * 
 * ⚠️ 提醒：Spring Boot 的 @Value 已自动处理占位符，此工具主要用于非配置文件场景
 */
@Component
public class SystemPropertyUtilsDemo {

    /**
     * 场景：配置路径占位符替换
     */
    public String resolvePath(String pathWithPlaceholder) {
        System.out.println("\n========== SystemPropertyUtils Demo ==========");
        
        // ✅ 自动替换系统属性
        String resolved = SystemPropertyUtils.resolvePlaceholders(pathWithPlaceholder);
        System.out.println("✓ 原始路径: " + pathWithPlaceholder);
        System.out.println("✓ 解析后路径: " + resolved);
        return resolved;
    }

    /**
     * 演示常用系统属性
     */
    public void demonstrateCommonProperties() {
        System.out.println("\n--- 常用系统属性 ---");
        
        String[][] properties = {
            {"${user.home}", "用户主目录"},
            {"${user.name}", "用户名"},
            {"${user.dir}", "当前工作目录"},
            {"${java.home}", "Java 安装目录"},
            {"${java.version}", "Java 版本"},
            {"${java.io.tmpdir}", "临时目录"},
            {"${os.name}", "操作系统名称"},
            {"${os.version}", "操作系统版本"},
            {"${file.separator}", "文件分隔符"},
            {"${path.separator}", "路径分隔符"}
        };
        
        for (String[] prop : properties) {
            String placeholder = prop[0];
            String description = prop[1];
            String value = SystemPropertyUtils.resolvePlaceholders(placeholder);
            System.out.println("✓ " + description + " (" + placeholder + "): " + value);
        }
        
        System.out.println();
    }

    /**
     * 演示复杂占位符解析
     */
    public void demonstrateComplexPlaceholders() {
        System.out.println("\n--- 复杂占位符解析 ---");
        
        // 1. 多个占位符
        String path1 = "${user.home}/app/${user.name}/logs";
        String resolved1 = SystemPropertyUtils.resolvePlaceholders(path1);
        System.out.println("✓ 多个占位符:");
        System.out.println("  原始: " + path1);
        System.out.println("  解析: " + resolved1);
        
        // 2. 嵌套文本
        String path2 = "日志目录：${java.io.tmpdir}/app-logs";
        String resolved2 = SystemPropertyUtils.resolvePlaceholders(path2);
        System.out.println("✓ 嵌套文本:");
        System.out.println("  原始: " + path2);
        System.out.println("  解析: " + resolved2);
        
        // 3. 默认值（使用 : 分隔符）
        String path3 = "${custom.prop:defaultValue}";
        String resolved3 = SystemPropertyUtils.resolvePlaceholders(path3);
        System.out.println("✓ 默认值:");
        System.out.println("  原始: " + path3);
        System.out.println("  解析: " + resolved3);
        
        System.out.println();
    }

    /**
     * 演示不存在的占位符处理
     */
    public void demonstrateNonExistentPlaceholders() {
        System.out.println("\n--- 不存在的占位符 ---");
        
        // 不存在的系统属性
        String path = "${non.existent.property}/data";
        
        try {
            String resolved = SystemPropertyUtils.resolvePlaceholders(path);
            System.out.println("✓ 未定义属性保持原样: " + resolved);
        } catch (IllegalArgumentException e) {
            System.out.println("✗ 解析失败: " + e.getMessage());
        }
        
        System.out.println();
    }

    /**
     * 实际应用场景：动态生成路径
     */
    public void demonstrateDynamicPaths() {
        System.out.println("\n--- 动态路径生成场景 ---");
        
        // 1. 日志目录
        String logDir = SystemPropertyUtils.resolvePlaceholders(
            "${user.home}/logs/myapp");
        System.out.println("✓ 日志目录: " + logDir);
        
        // 2. 配置目录
        String configDir = SystemPropertyUtils.resolvePlaceholders(
            "${user.home}/.config/myapp");
        System.out.println("✓ 配置目录: " + configDir);
        
        // 3. 临时文件目录
        String tempDir = SystemPropertyUtils.resolvePlaceholders(
            "${java.io.tmpdir}/myapp-temp");
        System.out.println("✓ 临时目录: " + tempDir);
        
        // 4. 跨平台路径
        String dataDir = SystemPropertyUtils.resolvePlaceholders(
            "${user.home}${file.separator}data${file.separator}db");
        System.out.println("✓ 数据目录: " + dataDir);
        
        System.out.println();
    }

    /**
     * 实际应用场景：测试环境路径
     */
    public void demonstrateTestPaths() {
        System.out.println("\n--- 测试环境路径场景 ---");
        
        // 测试临时目录
        String testTempDir = SystemPropertyUtils.resolvePlaceholders(
            "${java.io.tmpdir}/test-${user.name}");
        System.out.println("✓ 测试临时目录: " + testTempDir);
        
        // 测试输出目录
        String testOutputDir = SystemPropertyUtils.resolvePlaceholders(
            "${user.dir}/target/test-output");
        System.out.println("✓ 测试输出目录: " + testOutputDir);
        
        System.out.println();
    }

    /**
     * 演示环境变量解析（需要特殊处理）
     */
    public void demonstrateEnvironmentVariables() {
        System.out.println("\n--- 环境变量 ---");
        
        System.out.println("✓ 注意：SystemPropertyUtils 主要解析系统属性，不是环境变量");
        System.out.println("✓ 系统属性（System.getProperty()）: ${user.home}");
        System.out.println("✓ 环境变量（System.getenv()）: PATH, JAVA_HOME 等");
        System.out.println("");
        System.out.println("✓ 要解析环境变量，使用：");
        System.out.println("  String javaHome = System.getenv(\"JAVA_HOME\");");
        System.out.println("");
        System.out.println("✓ 或在 Spring 中使用：");
        System.out.println("  @Value(\"${JAVA_HOME}\")");
        System.out.println("  private String javaHome;");
        
        System.out.println();
    }

    /**
     * 与 Spring @Value 对比
     */
    public void compareWithSpringValue() {
        System.out.println("\n--- 与 Spring @Value 对比 ---");
        
        System.out.println("✓ SystemPropertyUtils:");
        System.out.println("  - 适用场景：动态生成路径、非 Spring 管理的类");
        System.out.println("  - 使用方式：");
        System.out.println("    String path = SystemPropertyUtils.resolvePlaceholders(\"${user.home}/logs\");");
        System.out.println("");
        System.out.println("✓ Spring @Value:");
        System.out.println("  - 适用场景：Spring 管理的 Bean、配置文件");
        System.out.println("  - 使用方式：");
        System.out.println("    @Value(\"${app.log.dir:${user.home}/logs}\")");
        System.out.println("    private String logDir;");
        System.out.println("");
        System.out.println("✓ 推荐：");
        System.out.println("  - Spring 项目优先使用 @Value");
        System.out.println("  - SystemPropertyUtils 用于动态场景");
        
        System.out.println();
    }

    /**
     * 实际应用示例：配置文件路径解析
     */
    public void demonstrateConfigFilePath() {
        System.out.println("\n--- 配置文件路径解析 ---");
        
        // 模拟从配置读取的路径（可能包含占位符）
        String[] configPaths = {
            "${user.home}/.myapp/config.yml",
            "${java.io.tmpdir}/cache/app.dat",
            "${user.dir}/logs/app.log",
            "/var/log/${user.name}/app.log"
        };
        
        System.out.println("✓ 解析配置文件路径:");
        for (String configPath : configPaths) {
            String resolved = SystemPropertyUtils.resolvePlaceholders(configPath);
            System.out.println("  - " + configPath);
            System.out.println("    => " + resolved);
        }
        
        System.out.println("==========================================\n");
    }

    /**
     * 最佳实践
     */
    public void printBestPractices() {
        System.out.println("\n========== 最佳实践 ==========");
        System.out.println("✓ 1. 主要用于动态生成路径，不是配置文件");
        System.out.println("✓ 2. Spring 项目优先使用 @Value 注解");
        System.out.println("✓ 3. 测试中动态生成临时目录路径");
        System.out.println("✓ 4. 跨平台路径使用 ${file.separator}");
        System.out.println("✓ 5. 提供默认值防止解析失败");
        System.out.println("✓ 6. 不要滥用，保持配置清晰可读");
        System.out.println("==========================================\n");
    }
}

